home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 007 / vtkerma1.arc / MSSERV.ASM < prev   
Assembly Source File  |  1986-02-13  |  28KB  |  1,111 lines

  1.     PAGE 59, 132
  2.  
  3.     TITLE MSSERV -- Module to handle all Server functions
  4.  
  5. ; Update 20 Jan 86
  6.  
  7. IF1
  8.  %OUT >> Starting pass 1
  9. ELSE
  10.  %OUT >> Starting pass 2
  11. ENDIF
  12.  
  13.     PUBLIC Logout, Bye, Finish, Remote, Get, Server, Enter_Server
  14.  
  15.     INCLUDE MsDefs.H
  16.  
  17. DataS    SEGMENT    PUBLIC 'DataS'
  18.  
  19.     EXTRN data:byte, flags:byte, trans:byte, pack:byte, curchk:byte
  20.     EXTRN fcb:byte, Data_2:BYTE, CurDsk:BYTE
  21.  
  22. remcmd    DB 0            ; Remote command to be executed. [21c]
  23. rempac    DB 0            ; Packet type: C (host) or G (generic). [21c]
  24.  
  25. ermes7  DB 'Unable to Receive Initiate$'
  26. erms18    DB '? Unable to tell host that session is finished',cr,lf,'$'
  27. erms19    DB '? Unable to tell host to logout',cr,lf,'$'
  28. erms21  DB '? Unable to tell host to execute command',cr,lf,'$' ; [21c]
  29. erms70    DB '? Unable to send INIT (I) packet',cr,lf,'$'
  30. infms1  DB cr,'              Server: Waiting for request$'
  31. infms2  DB cr,'             Getting: Waiting for file$'
  32. infms3  DB cr,'             Getting: Sending request to remote server$'
  33. remms1    DB 'Remote '
  34.     Program_name
  35.     db ': Unknown server command$'
  36. remms2    DB 'Remote '
  37.     Program_name
  38.     db ': Illegal file name$'
  39. remms3    DB 'Remote '
  40.     Program_name
  41.     db ': Unknown generic server command$'
  42. remms4  DB 'Remote '
  43.     Program_name
  44.     db ': Unable to change directories$'; [jrd]
  45. pass    DB 'Password: $'    ; When changing remote directories
  46. crlf    DB cr,lf,'$'
  47. tmp    DB ?,'$'
  48. temp    DW 0
  49. oloc    DW 0            ; Original buffer location. [21c]
  50. osiz    DW 0            ; Original buffer size. [21c]
  51. inpbuf    DW 0            ; Pointer to input buffer. [21c]
  52. cnt    DW 0
  53. delinp    DB BS,BS,BS,'   ',BS,BS,BS,'$' ; When DEL key is used. [21d]
  54. clrspc  DB ' ', Bs, '$'        ; Clear space
  55.  
  56. srvchr    DB 'SRGIE'        ; server cmd characters
  57. srvfln    EQU $-srvchr        ; length of tbl
  58. srvfun    DW srvsnd,srvrcv,srvgen,srvini,RSkp
  59.  
  60. remhlp    DB cr,lf,' CWD connect to a directory' ; [21c start]
  61.     DB cr,lf,' DELETE a file'
  62.     DB cr,lf,' DIRECTORY listing'
  63.     DB cr,lf,' HELP'
  64.     DB cr,lf,' HOST command'
  65.     DB cr,lf,' SPACE in a directory'
  66.     DB cr,lf,' TYPE a file$' ; [21c end]
  67.  
  68. remtab    DB 7
  69.     mkeyw    'CWD',remcwd
  70.     mkeyw    'DELETE',remdel
  71.     mkeyw    'DIRECTORY',remdir
  72.     mkeyw    'HELP',remhel
  73.     mkeyw    'HOST',remhos
  74.     mkeyw    'SPACE',remdis
  75.     mkeyw    'TYPE',remtyp
  76.  
  77. remfnm    DB ' Remote Source File: $'
  78. lclfnm    DB ' Local Destination File: $'
  79. filhlp    DB ' File name to receive as$'
  80. filmsg    DB ' Remote file specification or confirm with carriage return$'
  81. frem    DB ' Name of file on remote system$'
  82. genmsg    DB ' Enter text to be sent to remote server$'
  83. SrvBuf    DB 80H DUP(?)
  84.  
  85. DataS    ENDS
  86.  
  87. Code    SEGMENT    PUBLIC
  88.  
  89.     EXTRN comnd:near, spack:near, RPack:near, init:near
  90.     EXTRN SerIni:NEAR, read2:near, rpar:near, spar:near
  91.     EXTRN rin21:near, rfile3:near, error1:near, clrfln:near
  92.     EXTRN dodel:near, clearl:near, dodec: near, doenc:near, PrtScr:NEAR
  93.     EXTRN packlen:near, send11:near, errpack:near, init1:near
  94.     EXTRN NAK:NEAR, rrinit:near, Error:near, Prompt:NEAR, Read1:NEAR
  95.     EXTRN Close_transfer_screen:NEAR, Show_retries:NEAR
  96.     EXTRN Do_CXZ_mode_line:NEAR, Show_error:NEAR, Show_status:NEAR
  97.  
  98.     ASSUME cs:Code, ds:DataS
  99.  
  100. ; LOGOUT - tell remote KERSRV to logout
  101.  
  102. LOGOUT    PROC
  103.     mov ah,cmcfm
  104.     call comnd        ; Get a confirm
  105.      jmp r
  106.     mov al, flags.remflg    ; Pick up current value of remote flag
  107.     push ax            ; Save it
  108.     mov flags.remflg, 1    ; Force us into remote mode for LOGOUT command
  109.     call logo
  110.      nop
  111.      nop
  112.      nop
  113.     pop ax
  114.     mov flags.remflg, al    ; Restore original value
  115.     jmp rskp
  116. LOGOUT    ENDP
  117.  
  118. LOGO    PROC
  119.  
  120.     mov pack.numtry,0    ; Initialize count
  121.     mov pack.numrtr,0    ; No retries yet
  122.     call serini        ; Initialize port.  [14]
  123.     mov ah,trans.chklen    ; Don't forget the checksum length
  124.     mov curchk,ah
  125.     mov trans.chklen,1    ; Use one char for server functions
  126.  
  127. logo1:    cmp pack.state,'A'    ; Did user type a ^C?
  128.      je logo2x        ; Yes just leave
  129.  
  130.     mov ah,pack.numtry
  131.     cmp ah,maxtry        ; Too many times?
  132.      js logo3        ;  No, try it
  133.  
  134. logo2:    mov ah,prstr
  135.     mov dx,offset erms19
  136.     int dos
  137.  
  138. logo2x:    mov ah,curchk
  139.     mov trans.chklen,ah    ; Restore value
  140.     ret
  141.  
  142. logo3:    inc pack.numtry        ; Increment number of tries
  143.     mov pack.argblk,0    ; Packet number zero
  144.     mov pack.argbk1,1    ; One piece of data
  145.     mov bx,offset data
  146.     mov ah,'L'
  147.     mov [bx],ah        ; Logout the remote host
  148.     mov cx,1        ; One piece of data
  149.     call doenc        ; Do encoding
  150.  
  151.     mov ah,'G'        ; Generic command packet
  152.     call spack
  153.      jmp SHORT logo2    ;  Tell user and die
  154.      nop
  155.  
  156.     call RPack        ; Get ACK (w/o screen msgs.)
  157.      jmp SHORT logo1    ;  Go try again
  158.      nop
  159.  
  160.     push ax
  161.     call dodec        ; Decode packet
  162.     mov ah,curchk
  163.     mov trans.chklen,ah    ; Restore value
  164.     pop ax
  165.  
  166.     cmp ah,'Y'        ; ACK?
  167.      jne logo4
  168.  
  169.     jmp rskp
  170.  
  171. logo4:    cmp ah,'E'        ; Error packet?
  172.      jnz logo1        ;  Try sending the packet again
  173.  
  174.     jmp error1
  175.  
  176. LOGO    ENDP
  177.  
  178.  
  179. ; FINISH - tell remote KERSRV to exit
  180.  
  181. FINISH    PROC
  182.     mov ah,cmcfm        ; Parse a confirm
  183.     call comnd
  184.      jmp r
  185.  
  186.     mov al, flags.remflg    ; Pick up current value of remote flag
  187.     push ax            ; Save it
  188.     mov flags.remflg, 1    ; Force us into remote mode for LOGOUT command
  189.  
  190.     mov pack.numtry,0    ; Initialize count
  191.     mov pack.numrtr,0    ; No retries yet
  192.     call serini        ; Initialize port.  [14]
  193.     mov ah,trans.chklen    ; Don't forget the checksum length
  194.     mov curchk,ah
  195.     mov trans.chklen,1    ; Use one char for server functions
  196.  
  197. fin1:    cmp pack.state,'A'    ; ^C typed?
  198.      je fin2x
  199.  
  200.     mov ah,pack.numtry
  201.     cmp ah,maxtry        ; Too many times?
  202.      js fin3        ;  Nope, try it
  203.  
  204. fin2:    mov ah,prstr
  205.     mov dx,offset erms18
  206.     int Dos
  207.  
  208. fin2x:    mov ah,curchk
  209.     mov trans.chklen,ah    ; Restore value
  210.     jmp SHORT fin5        ; Go home
  211.  
  212. fin3:    inc pack.numtry        ; Increment number of tries
  213.     mov pack.argblk,0    ; Packet number zero
  214.     mov pack.argbk1,1    ; One piece of data
  215.     mov bx,offset data
  216.     mov ah,'F'
  217.     mov [bx],ah        ; Finish running Kermit
  218.     mov cx,1        ; One piece of data
  219.     call doenc        ; Do encoding
  220.  
  221.     mov ah,'G'        ; Generic command packet
  222.     call spack
  223.      jmp SHORT fin2        ;  Tell user and die
  224.      nop
  225.  
  226.     call RPack        ; Get ACK (w/o screen stuff)
  227.      jmp SHORT fin1        ;  Go try again
  228.      nop
  229.  
  230.     push ax
  231.     call dodec        ; Decode data
  232.     mov ah,curchk
  233.     mov trans.chklen,ah    ; Restore value
  234.     pop ax
  235.  
  236.     cmp ah,'Y'        ; Got an ACK?
  237.      jnz fin4
  238.     jmp SHORT fin5        ; Yes, then we're done
  239.  
  240. fin4:    cmp ah,'E'        ; Error packet?
  241.      jnz fin1        ;  Try sending it again
  242.  
  243.     call error1
  244.  
  245. fin5:    pop ax
  246.     mov flags.remflg, al    ; Restore original value
  247.     jmp rskp
  248.  
  249. FINISH    ENDP
  250.  
  251.  
  252. ; BYE command - tell remote KERSRV to logout & exits to DOS
  253.  
  254. BYE    PROC
  255.  
  256.     mov ah,cmcfm        ; Parse a confirm
  257.     call comnd
  258.      jmp r
  259.  
  260.     mov al, flags.remflg    ; Pick up current value of remote flag
  261.     push ax            ; Save it
  262.     mov flags.remflg, 1    ; Force us into remote mode for LOGOUT command
  263.  
  264.     call logo        ; Tell the mainframe to logout
  265.      jmp SHORT Bye_1    ;  Don't exit yet
  266.      nop            ;  3 bytes
  267.  
  268.     mov flags.extflg,1    ; Set exit flag
  269.  
  270. Bye_1:    pop ax
  271.     mov flags.remflg, al    ; Restore original value
  272.     jmp rskp
  273.  
  274. BYE    ENDP
  275.  
  276.  
  277. ; Tell remote server to send the specified file(s)
  278.  
  279. Get    PROC
  280.  
  281.     mov flags.droflg,0    ; Reset flags from fn parsing
  282.     mov flags.nmoflg,0    ; Reset flags from fn parsing
  283.     mov flags.cxzflg,0    ; no ctl-c typed yet..
  284.     mov bx,offset data    ; Where to put text.  [8 start]
  285.     mov dx,offset filmsg    ; In case user needs help
  286.     mov ah,cmtxt
  287.         call comnd              ; Get text or confirm
  288.          jmp RSkp        ;  Failed
  289.  
  290.     cmp ah,0        ; Read in any chars?
  291.      jne get4        ; Yes, then OK
  292.  
  293. ; Empty line, ask for file names
  294.  
  295. Get1:    mov dx,offset remfnm    ; ask for remote first
  296.     call prompt
  297.     mov bx,offset data
  298.     mov dx,offset frem
  299.     mov ah,cmtxt
  300.     call comnd        ; get a line of text
  301.      jmp RSkp
  302.  
  303.     cmp flags.cxzflg,'C'    ; ctl-C typed?
  304.      jne get2        ; no, continue
  305.  
  306.     jmp rskp
  307.  
  308. get2:    cmp ah,0
  309.      je get1        ;  Ignore empty lines
  310.  
  311.     mov bl,ah
  312.     mov bh,0
  313.     mov byte ptr data[bx],'$' ; terminate name for printing
  314.     mov pack.argbk1,bx    ; remember length here
  315.     mov dx,offset lclfnm
  316.     call prompt
  317.     mov ah,cmifi
  318.     mov bx,offset filhlp
  319.     mov dx,offset fcb
  320.     call comnd
  321.      jmp RSkp
  322.  
  323.     mov ah,cmcfm
  324.     call comnd
  325.      jmp r
  326.  
  327.     cmp flags.cxzflg,'C'    ; control-C typed?
  328.      jne get3        ; no, keep going
  329.  
  330.     jmp rskp
  331.  
  332. get3:    mov flags.nmoflg,1    ; remember changed name
  333.     jmp short get5
  334.  
  335. get4:    mov al,ah
  336.     mov ah,0
  337.     mov pack.argbk1,ax    ; Remember number of chars we read
  338.     mov byte ptr [bx],'$'    ; use for printing
  339.  
  340. get5:    push cx            ; Save regs
  341.     push si
  342.     push di
  343.     mov cx, 5Ah        ; Size of the Data and Data_2 buffers
  344.     mov si, OFFSET Data    ; Copy from ...
  345.     mov di, OFFSET Data_2    ; Copy to ...
  346.     rep movsb        ; Copy from Data to Data_2
  347.     mov cx, Pack.ArgBk1    ; Pick up size of data packet
  348.     mov Temp, cx        ; Save it for a minute
  349.     pop di            ; Restore regs
  350.     pop si
  351.     pop cx
  352.  
  353.     call Init        ; Clear line and initialize buffers
  354.  
  355.     mov dx, OFFSET InfMs3    ; Say we are sending a request for the file
  356.     call Show_status    ; Display the message
  357.  
  358.     call IPack        ; Send our INITIATE params to the server
  359.      jmp Get_error        ;  Couldn't do it
  360.  
  361.     push cx            ; Save regs
  362.     push si
  363.     push di
  364.     mov cx, Temp        ; Get back size of data packet
  365.     mov Pack.ArgBk1, cx    ; Restore it
  366.     mov cx, 5Ah        ; Size of the Data and Data_2 buffers
  367.     mov si, OFFSET Data_2    ; Copy from ...
  368.     mov di, OFFSET Data    ; Copy to ...
  369.     rep movsb        ; Copy from Data_2 back to Data area
  370.     pop di            ; Restore regs
  371.     pop si
  372.     pop cx
  373.  
  374.     call serini        ; Initialize port
  375.     mov pack.pktnum,0    ; Set packet number to zero
  376.     mov pack.numtry,0    ; Initialize count
  377.     mov pack.numpkt,0    ; Set the number of packets to zero
  378.     mov pack.numrtr,0    ; No retries yet
  379.     mov pack.state,'R'    ; this is what state will soon be..
  380.     cmp flags.remflg,0    ; remote mode?
  381.      jne get6        ; yes, don't print anything
  382.  
  383.     mov dx, OFFSET InfMs2    ; Say we are waiting for the file
  384.     call Show_status    ; Display the message
  385.     call clrfln        ; Prepare to print filename
  386.     mov ah,prstr
  387.     mov dx,offset data    ; Print file name
  388.     int dos
  389.  
  390. get6:    call init1        ; init buffers
  391.     mov cx,pack.argbk1    ; Data size
  392.     call doenc        ; Encode data
  393.     mov ah,trans.chklen    ; Don't forget the checksum length
  394.     mov curchk,ah
  395.     mov trans.chklen,1    ; Use one char for server functions
  396.  
  397. get7:    cmp pack.state,'A'    ; Did user type a ^C?
  398.     je get9            ; Yes - just return to main loop
  399.     call Show_retries    ; Give a progress report
  400.     cmp pack.numtry, imxtry    ; Too many times?
  401.      jb get10        ;  Nope, try it
  402.  
  403. Get8:    mov dx, OFFSET ErMes7    ; Unable to Receive Initiate
  404.     jmp SHORT Get8a        ; Joint common code
  405.  
  406. Get_error:
  407.     mov dx, OFFSET erms70    ; Message to say we couldn't send INIT packet
  408.  
  409. Get8a:    call Show_error
  410.  
  411. Get9:    call Close_transfer_screen ; Erase mode line, go to lower left
  412.     mov ah,curchk
  413.     mov trans.chklen,ah    ; Restore value
  414.     jmp rskp        ; Go home
  415.  
  416. get10:    inc pack.numtry        ; Increment number of tries
  417.     mov pack.argblk,0    ; Start at packet zero
  418.  
  419.     mov ah,'R'        ; Receive init packet
  420.     call spack        ; Send the packet
  421.      jmp SHORT get8        ;  Tell user we can't do it
  422.      nop
  423.  
  424.     call RPack        ; Get ACK (w/o screen stuff)
  425.      jmp SHORT Get11    ;  Got a NAK - try again
  426.      nop
  427.  
  428.     push ax
  429.     mov ah,curchk
  430.     mov trans.chklen,ah    ; Restore value
  431.     pop ax
  432.  
  433.     mov pack.argbk2,ax    ; this is where rinit wants pkt type if getting
  434.     mov flags.getflg,1    ; "Get" as vs "Receive"
  435.     jmp Read1        ; go join read code
  436.  
  437. Get11:    inc Pack.NumRtr        ; Bump number of retries
  438.     jmp Get7        ; Go try again
  439.  
  440. GET    ENDP
  441.  
  442.  
  443. ; Server command
  444.  
  445. Server    PROC
  446.     mov    ah,cmcfm
  447.     call    comnd
  448.      jmp    r
  449.  
  450. ; Pre-confirmed entry to Server Mode, enter from Terminal Emulation Mode
  451.  
  452. Enter_Server:
  453.     push    es
  454.     mov    ax,ds
  455.     mov    es,ax        ; address data segment
  456.     mov    al,flags.remflg    ; get remote flag
  457.     push    ax        ; preserve for later
  458.  
  459. ;    mov    flags.remflg,1    ; set remote if server (Turn on server screen)
  460.  
  461.     mov Flags.NmOFlg, 0    ; Clear the name override flag
  462.                 ;  (CMIFI leaves it set)
  463.     mov Flags.DrOFlg, 0    ; Likewise for drive override
  464.  
  465.     call    Init        ; Clear screen, display template & mode line
  466.     call    serini        ; Init serial port
  467.  
  468. ; should reset to default parms here..
  469. ; should increase timeout interval
  470.  
  471. Serv1:    mov    trans.chklen,1    ; checksum len = 1
  472.     mov    pack.pktnum,0    ; pack number resets to 0
  473.     mov    pack.numtry,0    ; no retries yet
  474.  
  475.     mov dx, OFFSET infms1    ; Message is "Server: Waiting for request"
  476.     call Show_status    ; Display status
  477.  
  478.     call    rpack        ; Get a packet
  479.      jmp SHORT Serv2    ;  No good, NAK and continue
  480.      nop
  481.  
  482.     jmp SHORT Serv3        ; Try to figure this out
  483.  
  484.     PUBLIC Serv2, Serv3
  485.  
  486. serv2:    cmp Flags.CxzFlg, 'C'    ; Control-C?
  487.      je Serv5        ;  Yes
  488.  
  489.     call    nak        ; nak the packet
  490.     jmp    serv1        ; and keep reading packets
  491.  
  492. serv3:    mov    di,offset srvchr ; server characters
  493.     mov    cx,srvfln    ; length of string
  494.     mov    al,ah        ; packet type
  495.     repne    scasb        ; hunt for it
  496.      je    serv4        ; we know this one, go handle it
  497.  
  498.     mov    bx,offset remms1 ; else give a message
  499.     call    errpack        ; back to local kermit
  500.     jmp    serv1        ; and keep looking for a cmd
  501.  
  502. serv4:    sub    di,offset srvchr+1 ; find offset, +1 for pre-increment
  503.     shl    di,1        ; convert to word index
  504.  
  505.     call    srvfun[di]    ; call the appropriate handler
  506.      jmp    serv5        ; someone wanted to exit..
  507.  
  508.     call Do_CXZ_mode_line    ; Called rtn trashed the mode line
  509.     jmp    serv1        ; Keep going for more cmds
  510.  
  511.  
  512. %OUT >> About half way through source file
  513.  
  514.  
  515. Serv5:    call Close_transfer_screen ; Close out the file transfer screen
  516.     pop    ax        ; get this off stack
  517.     mov    flags.remflg,al    ; restore old flag
  518.     pop    es        ; restore register
  519.     jmp    rskp        ; and return
  520.  
  521. Server    ENDP
  522.  
  523.  
  524. ;                        ***   Server Commands   ***
  525.  
  526. ; srvsnd - receives a file that the local kermit is sending
  527. srvsnd    PROC
  528.     mov    bx,offset data
  529.     call    spar        ; parse the send-init packet
  530.     call    packlen        ; figure max packet
  531.     mov    bx,offset data
  532.     call    rpar        ; make answer for them
  533.     mov    al,ah        ; length of packet
  534.     mov    ah,0
  535.     mov    pack.argbk1,ax    ; store length for spack
  536.     mov    ah,'Y'        ; ack
  537.     call    spack        ; answer them
  538.      jmp    rskp        ; can't answer, forget this
  539.     call    rrinit        ; init variables for init
  540.     inc    pack.pktnum    ; count the send-init packet
  541.     mov    pack.state,'F'    ; expecting file name about now
  542.     call    Read1        ;  and join read code
  543.      nop
  544.      nop
  545.      nop            ; ignore errors
  546.  
  547.     jmp    rskp        ; and return for more
  548.  
  549. SrvSnd    endp
  550.  
  551.  
  552. ; srvrcv - send a file that they're receiving
  553. srvrcv    PROC
  554.     call DoDec        ; Fix up the encoded filename
  555.     mov    si,offset data    ; this should be it after decoding
  556.     mov    di,offset fcb    ; this is where filename goes
  557.     mov    al,1        ; skip leading separators
  558.     mov    ah,prsfcb    ; parse an fcb
  559.     int    dos        ; let dos do the work
  560.     cmp    al,0ffh        ; invalid?
  561.     jne    srvrc1        ; no, keep going
  562.     mov    bx,offset remms2 ; complain
  563.     call    errpack        ; that we can't find it
  564.     jmp    rskp        ; and return
  565.  
  566. SrvRc1:    cmp    al, 1        ; Wildcards used?
  567.      jne     SrvRc2        ;  No
  568.  
  569.     mov Flags.WldFlg, 0FFh    ; Flag the wildcard
  570.  
  571. SrvRc2:    mov    pack.state,'R'    ; remember state
  572.     call    send11        ; this should send it
  573.      nop
  574.      nop
  575.      nop
  576.  
  577.     jmp    rskp        ; return in any case
  578.  
  579. SrvRcv    ENDP
  580.  
  581.  
  582.     PUBLIC SrvGen
  583.  
  584. ; srvgen - generic server commands
  585. ; We only support Logout and Finish right now
  586. srvgen    PROC
  587.     call DoDec        ; Decode the data packet
  588.     mov    al,data        ; get 1st packet char
  589.     cmp al, 'C'        ; Remote CWD (Change Working Directory)?
  590.      jne srvge0        ;  No
  591.  
  592.     call Remote_CWD        ; Use other routine to do the CWD
  593.     jmp RSkp        ; Return normally
  594.  
  595. srvge0:    cmp    al,'F'        ; maybe finish?
  596.     je    srvge1        ; yup, handle
  597.     cmp    al,'L'        ; logout?
  598.     jne    srvge2        ; no
  599. srvge1:    mov    pack.argbk1,0    ; 0-length data
  600.     mov    ah,'Y'
  601.     call    spack        ; ack it
  602.      nop
  603.      nop
  604.      nop            ; *** ignore error?
  605.  
  606.     ret            ; and return to signal exit
  607.  
  608. srvge2:    mov    bx,offset remms3
  609.     call    errpack
  610.     jmp    rskp
  611.  
  612. srvgen    endp
  613.  
  614.  
  615.     PUBLIC Remote_CWD
  616.  
  617. ; Do a REMOTE CWD for the other Kermit
  618.  
  619. Remote_CWD PROC
  620.  
  621.     mov cl, data+1        ; get the filename byte count
  622.     sub cl, ' '           ; ascii to numeric
  623.     cmp cl, 0             ; anything there?
  624.      jle srcwd3           ; le = no, an error
  625.  
  626.     sub ch, ch             ; set up counter
  627.     mov si, OFFSET data+2    ; received dir spec, from rpack
  628.     mov di, OFFSET srvbuf    ; destination
  629.     rep movsb            ; copy data to srvbuf, cx chars worth
  630.  
  631.     mov BYTE PTR [di],0    ; plant terminator
  632.     mov dx, OFFSET srvbuf    ; for DOS
  633.     mov ax, dx            ; dir spec pointer for isfile
  634.     cmp BYTE PTR [di-1], ':' ; did user just type A: or similar?
  635.      je srcwd1           ; e = yes, so skip directory part
  636.  
  637.     mov ah, chdir         ; want to do change dir
  638.     int Dos
  639.      jnc srcwd1           ; nc = ok
  640.  
  641. srcwd3: mov bx, OFFSET remms4    ; an error.
  642.     jmp errpack          ; send the bad news, ret from there
  643.  
  644. srcwd1: mov dl, data+3        ; see if drive given (look for :)
  645.     cmp dl, ':'
  646.      jne srcwd2           ; ne = no drive
  647.  
  648.     mov dl, data+2
  649.     and dl, 5fH           ; convert to upper case
  650.     sub dl, 'A'           ; count A = 0 for seldsk call
  651.     mov ah, seldsk
  652.     int Dos              ; change disks
  653.      jc srcwd3           ; c = an error
  654.  
  655.     inc dl               ; now make A = 1 etc internally
  656.     mov curdsk, dl        ; and update internal current disk code
  657.  
  658. srcwd2: mov ah, 'Y'        ; return an ack
  659.     mov pack.argbk1, 0    ; no data
  660.     call spack        ; Send the packet
  661.      nop
  662.      nop
  663.      nop
  664.  
  665.     ret            ; Done here
  666.  
  667. Remote_CWD ENDP
  668.  
  669. ; srvini - init parms based on init packet
  670. srvini    PROC
  671.  
  672.     mov    bx,offset data
  673.     call    spar        ; parse info
  674.     call    packlen        ; this should really be part of spar, but..
  675.     mov    bx,offset data
  676.     call    rpar        ; get receive info
  677.     mov    al,ah
  678.     mov    ah,0
  679.     mov    pack.argbk1,ax    ; set size of return info
  680.     mov    ah,'Y'
  681.     call    spack        ; send the packet off
  682.      jmp    rskp
  683.  
  684.     jmp    rskp        ; and go succeed
  685.  
  686. srvini    endp
  687.  
  688. ;       This is the REMOTE command. [21c]
  689.  
  690. REMOTE    PROC
  691.     mov dx,offset remtab    ; Parse a keyword from the REMOTE table
  692.     mov bx,offset remhlp
  693.     mov ah,cmkey
  694.     call comnd
  695.      jmp r
  696.  
  697.     mov al, flags.remflg    ; Pick up current value of remote flag
  698.     push ax            ; Save it
  699.     mov flags.remflg, 1    ; Force us into remote mode for LOGOUT command
  700.  
  701.     call bx            ; Call the appropriate routine
  702.      nop            ;  Tolerate skip and non-skip returns
  703.      nop
  704.      nop
  705.  
  706.     pop ax
  707.     mov flags.remflg, al    ; Restore original value
  708.     jmp rskp
  709.  
  710. REMOTE    ENDP
  711.  
  712. ; REMDIS - Get disk usage on remote system. [21c]
  713.  
  714. REMDIS    PROC
  715.     mov remcmd,'U'        ; Disk usage command
  716.     mov rempac,'G'        ; Packet type = generic
  717.     jmp genric        ; Execute generic Kermit command
  718. REMDIS    ENDP
  719.  
  720.  
  721. ; REMHEL - Get help about remote commands. [21c]
  722.  
  723. REMHEL    PROC
  724.     mov remcmd,'H'        ; Help.....
  725.     mov rempac,'G'        ; Packet type = generic
  726.     jmp genric        ; Execute generic Kermit command
  727. REMHEL    ENDP
  728.  
  729. ; REMTYP - Print a remote file. [21c]
  730.  
  731. REMTYP    PROC
  732.     mov remcmd,'T'        ; Type the file
  733.     mov rempac,'G'        ; Packet type = generic
  734.     jmp genric
  735. REMTYP    ENDP
  736.  
  737. ; REMHOS - Execute a remote host command. [21c]
  738.  
  739. REMHOS    PROC
  740.     mov remcmd,' '        ; Don't need one
  741.     mov rempac,'C'        ; Packet type = remote command
  742.     jmp genric
  743. REMHOS    ENDP
  744.  
  745. ; REMDIR - Do a directory. [21c]
  746.  
  747. REMDIR    PROC
  748.     mov remcmd,'D'
  749.     mov rempac,'G'        ; Packet type = generic
  750.     jmp genric
  751. REMDIR    ENDP
  752.  
  753. ; REMDEL - Delete a remote file. [21c]
  754.  
  755. REMDEL    PROC
  756.     mov remcmd,'E'
  757.     mov rempac,'G'        ; Packet type = generic
  758.     jmp genric
  759. REMDEL    ENDP
  760.  
  761. ; REMCWD - Change remote working directory.  [21c]
  762.  
  763. REMCWD    PROC
  764.     mov remcmd,'C'
  765.     mov rempac,'G'        ; Packet type = generic
  766. ;    jmp genric
  767. REMCWD    ENDP
  768.  
  769. ; GENRIC - Send a generic command to a remote Kermit server. [21c]
  770.  
  771. GENRIC    PROC
  772.     mov bx,offset SrvBuf    ; Where to put the text
  773.     cmp rempac,'C'        ; Remote host command?
  774.     je genra        ; Yes, leave as is
  775.     add bx,2        ; Leave room for type and size
  776. genra:    mov ah,cmtxt        ; Parse arbitrary text up to a CR
  777.     mov dx,offset genmsg    ; In case they want text
  778.     call comnd
  779.      jmp r
  780.  
  781.     mov al,ah        ; Don't forget the size
  782.     mov ah,0
  783.     mov cnt,ax        ; Save it here
  784.  
  785.     cmp rempac,'C'        ; Remote host command?
  786.      jne genrb        ; No, skip this part
  787.  
  788.     call ipack
  789.      jmp genr2
  790.  
  791.     mov pack.numtry,0
  792.     mov ah,trans.chklen
  793.     mov curchk,ah        ; Save desired checksum length
  794.     mov trans.chklen,1    ; Use 1 char for server functions
  795.     mov pack.numrtr,0    ; No retries yet
  796.     jmp genr1        ; Send the packet
  797. genrb:    mov ax,cnt
  798.     cmp ax,0        ; Any data?
  799.     je genr0        ; Nope
  800.     mov ah,al        ; Don't overwrite the real count value
  801.     add ah,32        ; Do the char function
  802.     mov temp,bx        ; Remember where we are
  803.     mov bx,offset SrvBuf+1    ; Size of remote command
  804.     mov [bx],ah
  805.     mov ah,0
  806.     inc al            ; For the size field
  807.     cmp remcmd,'C'        ; Change working directory?
  808.      jne genr0        ;  No, so don't ask for password
  809.  
  810.     mov cnt,ax        ; Save here for a bit
  811.     mov ah,prstr
  812.     mov dx,offset pass    ; Send along an optional password
  813.     int dos
  814.  
  815.     mov bx,temp        ; Where to put the password
  816.     push bx            ; Is safe since subroutine never fails
  817.     inc bx            ; Leave room for count field
  818.     call input        ; Read in the password
  819.     mov temp,bx        ; Remember end of data pointer
  820.     pop bx            ; Where to put the size
  821.  
  822.     cmp ah,0        ; No password given?
  823.      jne genrc
  824.  
  825.     mov ax,cnt
  826.     jmp genr0a        ; Then that's it
  827.  
  828. genrc:    mov al,ah
  829.     add ah,32        ; Make it printable
  830.     mov [bx],ah        ; Tell remote host the size
  831.     mov ah,0
  832.     push ax            ; Remember the count
  833.     call clearl        ; Clear to end-of-line
  834.     pop ax
  835.     inc al            ; For second count value
  836.     add ax,cnt        ; Total for both fields of input
  837.  
  838. genr0a:    push ax            ; Save ax
  839.     mov ah, PrStr        ; Code to type a string
  840.     mov dx, OFFSET CrLf    ; A CrLf
  841.     int Dos            ; Type it
  842.     pop ax            ; Get back ax
  843.  
  844. genr0:    inc al            ; For the char representing the command
  845.     mov pack.argbk1,ax    ; Set the size
  846.     mov cnt,ax        ; And remember it
  847.     mov pack.numtry,0    ; Initialize count
  848.     mov bx,offset SrvBuf    ; Start of data buffer
  849.     mov ah,remcmd        ; Command subtype
  850.     mov [bx],ah
  851.     call ipack        ; Send init parameters
  852.      jmp SHORT genr2
  853.      nop            ; Make it 3 bytes long
  854.     mov ah,trans.chklen
  855.     mov curchk,ah        ; Save desired checksum length
  856.     mov trans.chklen,1    ; Use 1 char for server functions
  857.     mov pack.numrtr,0    ; No retries yet
  858. genr1:    cmp pack.state,'A'    ; Did the user type a ^C?
  859.     je genr2x
  860.     mov ah,pack.numtry
  861.     cmp ah,maxtry        ; Too many tries?
  862.     js genr3        ; Nope, keep trying
  863. genr2:    mov ah,prstr
  864.     mov dx,offset erms21    ; Print error msg and fail
  865.     int dos
  866.  
  867. genr2x:    mov ah,curchk
  868.     mov trans.chklen,ah    ; Restore
  869.     jmp rskp
  870.  
  871. genr3:    push es            ; Prepare to put string into packet
  872.     mov ax,ds
  873.     mov es,ax
  874.     mov si,offset SrvBuf    ; Move from here
  875.     mov di,offset data    ; to here
  876.     mov cx,cnt        ; Move this many characters
  877.     rep movsb        ; Perform the string move
  878.     pop es
  879.     mov ax,cnt
  880.     mov pack.argbk1,ax    ; How much data to send
  881.     mov cx,ax        ; Size of data
  882.     call doenc        ; Encode it
  883.     inc pack.numtry        ; Increment number of trials
  884.     mov pack.argblk,0       ; Packet number 0
  885.     mov ah,rempac        ; Packet type
  886.     call spack        ; Send the packet
  887.      jmp genr2        ; Tell user we can't do it
  888.      nop
  889.     call RPack        ; Get ACK (w/o screen stuff)
  890.      jmp genr1        ; Got a NAK - try again
  891.      nop
  892.  
  893.     push ax
  894.     mov ah,curchk
  895.     mov trans.chklen,ah    ; Restore
  896.     pop ax
  897.  
  898.     cmp ah,'Y'        ; Is all OK?
  899.      jne genr4
  900.  
  901.     cmp pack.argbk1,0    ; Any data in the ACK?
  902.      je genr31        ;  Nope - just return
  903.  
  904.     call dodec        ; Decode data
  905.  
  906.     mov ah,prstr
  907.     mov dx,offset crlf    ; First go to a new line
  908.     int dos
  909.  
  910.     mov di,offset data    ; Where the reply is
  911.     mov cx,pack.argbk1    ; How much data we have
  912.     call prtscr        ; Print it on the screen
  913.  
  914.     mov ah,prstr
  915.     mov dx,offset crlf    ; Go to a new line
  916.     int dos
  917.  
  918.     mov ah,prstr
  919.     mov dx,offset crlf    ; Go to a new line
  920.     int dos
  921.  
  922. genr31:    jmp rskp        ; And we're done
  923.  
  924. genr4:    cmp ah,'X'        ; Text packet?
  925.     je genr5
  926.  
  927.     cmp ah,'S'        ; Handling this like a file?
  928.     jne genr6
  929.  
  930.     mov pack.state,'R'    ; Set the state
  931.     mov bx,offset rin21    ; Where to go to
  932.     jmp genr51        ; Continue
  933.  
  934. genr5:    mov pack.state,'F'
  935.     call dodec        ; Decode data
  936.     mov bx,offset rfile3    ; Jump to here
  937.  
  938.     PUBLIC genr4,genr5,genr51,genr6
  939.  
  940. genr51:    mov tmp,ah        ; Save packet type
  941.     mov flags.xflg,1    ; Remember we saw an "X" packet
  942.     mov pack.numtry,0
  943.     mov pack.numrtr,0
  944.     mov pack.numpkt,0
  945.     mov pack.pktnum,0
  946.     mov flags.cxzflg,0
  947.     mov ah,tmp        ; Packet type
  948.     call bx            ; Handle it almost like filename
  949.     call read2        ; Receive the rest
  950.      jmp r            ;  Oops, we failed
  951.  
  952.     jmp rskp        ; Done OK
  953.  
  954. genr6:    cmp ah,'E'        ; Error packet?
  955.      je genr6x
  956.  
  957.     jmp genr1        ; Try again
  958.  
  959. genr6x: call dodec        ; Decode data
  960.     call error1        ; Print the error messge
  961.     jmp rskp        ; And return
  962.  
  963. GENRIC    ENDP
  964.  
  965.  
  966. ; Send "I" packet with transmission parameters. [21c]
  967.  
  968. IPACK    PROC    NEAR
  969.     mov ah,trans.chklen
  970.     mov curchk,ah        ; Initialize
  971.     call serini
  972.     mov pack.pktnum,0    ; Use packet number 0
  973.     mov pack.numtry,0    ; Number of retries
  974. ipk0:   cmp pack.state,'A'    ; Did user type a ^C?
  975.     je ipk0x
  976.     cmp pack.numtry,imxtry  ; Reached our limit?
  977.     jl ipk1
  978. ipk0x:    ret            ; Yes, so we fail
  979. ipk1:   inc pack.numtry         ; Save the updated number of tries
  980.     mov bx,offset data      ; Get a pointer to our data block
  981.     call rpar               ; Set up the parameter information
  982.     xchg ah,al
  983.     mov ah,0
  984.     mov pack.argbk1,ax      ; Save the number of arguments
  985.     mov pack.argblk,0    ; Use packet number 0
  986.     mov ah,trans.chklen
  987.     mov curchk,ah        ; Save real value
  988.     mov trans.chklen,1    ; One char for server function
  989.     mov ah,'I'              ; "I" packet
  990.     call spack              ; Send the packet
  991.      jmp ipk4
  992.      nop
  993.     call RPack             ; Get a packet
  994.      jmp ipk4               ; Try again
  995.      nop
  996.     push ax
  997.     mov ah,curchk
  998.     mov trans.chklen,ah    ; Reset
  999.     pop ax
  1000.     cmp ah,'Y'              ; ACK?
  1001.     jne ipk3                ; If not try next
  1002.     mov ax,pack.pktnum      ; Get the packet number
  1003.     cmp ax,pack.argblk      ; Is it the right packet number?
  1004.     je ipk2
  1005.      jmp ipk0               ; If not try again
  1006. ipk2:   mov ax,pack.argbk1      ; Get the number of pieces of data
  1007.     mov bx,offset data      ; Pointer to the data
  1008.     call spar               ; Read in the data
  1009.     mov ah,trans.chklen
  1010.     mov curchk,ah        ; This is what we decided on
  1011.     call packlen        ; Get max send packet size. [21b]
  1012.     mov pack.numtry,0       ; Reset the number of tries
  1013.     jmp rskp
  1014. ipk3:   cmp ah,'N'              ; NAK?
  1015.     je ipk0                 ; Yes, try again
  1016.     cmp ah,'E'              ; Is it an error packet
  1017.     je ipk3x
  1018.     jmp ipk0        ; Trashed data
  1019. ipk3x:    jmp rskp        ; Other side doesn't know about "I" packet
  1020. ipk4:    mov ah,curchk
  1021.     mov trans.chklen,ah    ; Reset
  1022.     jmp ipk0        ; Keep trying
  1023. IPACK    ENDP
  1024.  
  1025. ; Returns in AH the count of characters read in
  1026. ;      in BX the updated pointer to the input buffer
  1027.  
  1028. INPUT    PROC
  1029.     mov cl,0        ; Keep a count
  1030.     mov inpbuf,bx        ; Where to put data
  1031. input0:    mov ah,conin        ; Read in a char
  1032.     int dos
  1033.     cmp al,CR        ; Done with input?
  1034.     jne input1
  1035.     mov ah,cl        ; Return count in AH
  1036.     jmp r
  1037. input1:    cmp al,BS        ; Backspace?
  1038.     je inpt11        ;
  1039.     cmp al,DEL        ; Or delete?
  1040.     jne input3
  1041.     call dodel        ; Erase weird character
  1042. inpt11:    dec cl            ; Don't include in char count
  1043.     cmp cl,0        ; Backspaced too much?
  1044.     jns input2        ; No, is OK
  1045.     push bx
  1046.     call clearl
  1047.     pop bx
  1048.     mov ah,conout
  1049.     mov dl,bell
  1050.     int dos
  1051.     mov cl,0
  1052.     jmp input0
  1053. input2:    dec bx            ; 'Remove' from buffer
  1054.     mov ah,prstr
  1055.     mov dx,offset clrspc
  1056.     int dos
  1057.     jmp input0        ; Go get more
  1058. input3:    cmp al,'U'-64        ; Control-U?
  1059.     jne input4
  1060.     mov ah,prstr
  1061.     mov dx,offset pass+1
  1062.     int dos
  1063.     push bx
  1064.     push cx
  1065.     call clearl        ; Blank out the line
  1066.     pop cx
  1067.     pop bx
  1068.     mov cl,0        ; Reset count to zero
  1069.     mov bx,inpbuf        ; Start at head of buffer
  1070.     jmp input0
  1071. input4:    cmp al,0        ; Two character sequence?
  1072.     jne input5
  1073.     mov ah,conin
  1074.     int dos            ; Get second char
  1075.     cmp al,83        ; Delete key?
  1076.     je inpt40        ; Yup
  1077.     cmp al,75        ; Backarrow key?
  1078.     je inpt40
  1079.     call dodel        ; Erase weird character
  1080.     jmp input0        ; And go on computing
  1081. inpt40:    mov ah,prstr
  1082.     mov dx,offset delinp    ; Erase weird character
  1083.     int dos
  1084.     jmp inpt11        ; Remove the offending char
  1085. input5: mov [bx],al        ; Add char to buffer
  1086.     inc cl            ; Include in count
  1087.     inc bx
  1088.     jmp input0
  1089. INPUT    ENDP
  1090.  
  1091.  
  1092. ; Jumping to this location is like retskp.  It assumes the instruction
  1093. ;   after the call is a jmp addr
  1094.  
  1095. RSKP    PROC    NEAR
  1096.     pop bp
  1097.     add bp,3
  1098.     push bp
  1099. ;    ret
  1100. RSKP    ENDP
  1101.  
  1102. ; Jumping here is the same as a ret
  1103.  
  1104. R       PROC    NEAR
  1105.     ret
  1106. R       ENDP
  1107.  
  1108. Code    ENDS
  1109.  
  1110.     END
  1111.